package com.zjz.demo.unsafe;

import java.lang.reflect.Array;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zjz
 * @Date: 2021/10/08/15:47
 * @Description:
 * @Target:  java.util.ConcurrentModificationException
 */
public class ListTest {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1", "2", "3");
//        list.forEach(System.out::println);


        // ArrayList 并发下不安全,解决方案
        // 1.  List<String> list1 = new Vector<>();  // Vector 出来的比ArrayList出来的早
        // 2. List<String> list1 = Collections.synchronizedList(new ArrayList<>());

//        List<String> list1 = new Vector<>();  // Vector 出来的比ArrayList出来的早

//        List<String> list1 = Collections.synchronizedList(new ArrayList<>());

        List<String> list1 = new CopyOnWriteArrayList<>();  // 写入时复制, COW 计算机程序设计领域的一种优化策略
        // 多线程调用时,list,读取的时候,固定的,写入时存在覆盖
        // 在写入时避免覆盖,造成数据问题
        // 读写分离 mycat
        // CopyOnWriteArrayList 比Vector 牛逼在哪里---只要由synchronized效率一般都低

     /*   for (int i = 0; i < 10; i++) {
            list1.add(UUID.randomUUID().toString().substring(0,5));
        }
*/

        for (int i = 0; i <= 100; i++) {
            new Thread(()->{
                list1.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(list1);
            },String.valueOf(i)).start();
        }

        list1.forEach(System.out::println);




    }
}
